<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 实现一个call
        // Function.prototype.myCall = function(context) {
        //   if (typeof this !== 'function') {
        //     throw new TypeError('not a function')
        //   }
        //   context.fn = this
        //   const args = [...arguments].slice(1)
        //   const result = context.fn(...args)
        //   delete context.fn
        //   return result
        // }
        // let obj = {
        //   name: 'berlin'
    
        // }
        // function a (z) {
        //   console.log(z);
        //   console.log(this.name)
        // }
        // a.myCall(obj, 25)

        // 实现一个apply
        // Function.prototype.myApply = function (ctx) {
        //   if (typeof this !== 'function') throw new TypeError('not a function')
        //   ctx = ctx || window
        //   ctx.fn = this
        //   let result
        //   if(arguments[1]) {
        //     result = ctx.fn(...arguments[1])
        //   } else {
        //     result = ctx.fn()
        //   }
        //  delete ctx.fn
        //   return result
        // }
        // let obj = {
        //   name: 'berlin'
        // }
        // function a (a, b, c) {
        //   console.log(this.name)
        //   console.log(a, b, c)
        // }
        // a.myApply(obj, [10, 20, 30])

        // 手写实现一个bind

        // Function.prototype.myBind = function (ctx) {
        //   if (typeof this !== 'function') throw new TypeError('not a function')
        //   ctx = ctx || window
        //   ctx.fn = this
        //   const args = [...arguments].slice(1)
        //   const result = ctx.fn(...args)
        //   delete ctx.fn
        //   return function () {
        //     return result
        //   } 
        // }
        // let obj = {
        //   name: 'berlin'
        // }
        // function a(z) {
        //   console.log(z)
        //   console.log(this.name)
        // }
        // a.myBind(obj, 1)()
        
    </script>
</body>
</html>